<?php
/**
 * 异常控制文件
 *
 * @author Mo yi <root@imoi.cn>
 * @link   http://www.imoi.cn
 * @copyright Copyright &copy; 2010-2012 DuoLam Software LLC
 * @license http://www.imoi.cn/license/
 * @version $Id: dpException.php 2799 2012-04-01 11:05:54Z Mo.yi $
 * @package system
 * @since 1.0
 */

class dpException extends Exception
{
    private static $_text = "系统视图文件不存在！";

    public static $trace  = array();

	private static $_exClass = array('dpException','dpApplication');

	/**
	 * 构造方法
	 */
	public function __construct($message, $code = 0)
    {
        parent::__construct($message, $code);
    }
	
	/**
	 * 错误输出方法
	 * @param string  $msg   错误信息
	 * @param boolean $db    是否是数据库错误
	 * @param array   $other 其他信息
	 */
    public static function error($msg,$db=false,$other = array(), $f = false, $log = true)
    {
		if (D::$config['system']['debug_model'] == false || $f) {

			if($db)
				$info = $msg . ',SQL：'.$other['sql'].', SQL ERROR：'.$other['errorInfo'];
			else
				$info = $msg;

			if($log)dpLoging::writeLog($info);

			$file = DP_PATH . DS . 'view' . DS . 'system' . DS . 'friendly_error.php';

		} else {

			$file = DP_PATH . DS . 'view' . DS . 'system'. DS .'error.php';
			self::$trace = debug_backtrace();

			foreach (self::$trace as $k => $result) {
				if (isset($result['file'])) {
					if ( strpos($result['file'], 'dpException') !== false ||
						strpos($result['file'], 'dpApplication') !== false ||
						strpos($result['file'], 'dpComponent') !== false
					)
					{
						unset(self::$trace[$k]);
					}
				}
			}
		}

		is_file($file) or exit(self::$_text);
        include $file;
        exit;
    }
    
	/**
	 * 404错误输出
	 * @param string $msg 提示信息
	 */
    public static function error_404($msg=null)
    {
        header('HTTP/1.1 404 Not Found');
        header('Status: 404 Not Found');
        $url = $_SERVER['HTTP_HOST'].D::homeUrl();
        $file404 = isset(D::$config['access']['file404']) ? D::$config['access']['file404'] : '';

        if (!empty(D::$config['access']['url404'])) {
            echo file_get_contents(D::$config['access']['url404']);
            exit;
        }

        if (empty($file404)) {
            $file = DP_PATH . DS . 'view' . DS . 'system'. DS .'404.php';
            is_file($file) or self::notice(self::$_text);
        } else {
            $file = $file404;
            is_file($file) or self::error('自定义的404文件不存在！' . $file);
        }

        include $file;
        exit;
    }

	/**
	 * 格式化出错文件代码
	 * @param string $file 文件
	 * @param int $line 出错行
	 */
    public static function setFile($file,$line)
    {
        if (is_file($file)) {
            $data = file($file);
            $count = count($data) - 1;
            $startLine = $line - 5;
            $endLine = $line + 5;

            if ($endLine > $count) {
                $endLine = $count + 1;
            }

            $datas = array();

            for ($i = $startLine; $i <= $endLine; $i++) {
                if($i == $line) {
                    $datas[] = '<div class="highcode">&nbsp;<span>' . $i .'</span>　' . self::highCode($data[$i-1],true) . '</div>';
                } else {
                    $datas[] = '&nbsp;' . $i . '　' . self::highCode($data[$i-1],true);
                }
            }

            return $datas;
        } else {
            return false;
        }
    }
	
	/**
	 * 高亮php代码
	 * @param string $code 代码
	 */
    public static function highCode($code)
    {
        $array1 = array(
            "/&lt;\?php&nbsp;/i",
        );
        $array2 = array(
            '',
        );
        return preg_replace($array1,$array2,highlight_string('<?php ' . $code,true));
    }
}
?>